package com.yiwyn.zero.fetcher;

import com.yiwyn.zero.domain.PayInfo;

import java.io.FileWriter;
import java.io.IOException;
import java.lang.reflect.Field;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 实体抓取器代码生成工具
 * 用于生成类似CustomerFetcher的类
 */
public class FetcherGenerator {

    /**
     * 生成抓取器类
     *
     * @throws IOException 生成文件时可能抛出的异常
     */
    public static void generateFetcher(Class<?> clazz) throws IOException {

        // 生成文件完整路径
        String simpleName = clazz.getSimpleName();

        Field[] fields = clazz.getDeclaredFields();

        String fetcherClassName = simpleName + "Fetcher";

        // 拼接代码内容
        StringBuilder code = new StringBuilder();

        // 1. 包声明
        code.append("package ").append(clazz.getPackage().getName()).append(";\n\n");

        // 2. 导入语句
        code.append("import ").append(clazz.getPackage().getName()).append(".").append(simpleName).append(";\n");

        // 3. 类注释
        code.append("/**\n");
        code.append(" * ").append(simpleName).append("抓取器\n");
        code.append(" */\n");

        code.append("public class ").append(fetcherClassName).append(" {\n\n");

        // 5. 实体字段定义
        code.append("    private ").append(simpleName).append(" ").append(lowerFirst(simpleName)).append(";\n\n");

        // 6. 构造方法
        code.append("    public ").append(fetcherClassName).append("(").append(simpleName).append(" ").append(lowerFirst(simpleName)).append(") {\n");
        code.append("        this.").append(lowerFirst(simpleName)).append(" = ").append(lowerFirst(simpleName)).append(";\n");
        code.append("    }\n\n");

        // 7. 字段枚举定义（如CustomerField）
        code.append("    public enum ").append(simpleName).append("Field {\n");


        List<String> fieldNames = Arrays.stream(fields).map(Field::getName).collect(Collectors.toList());

        for (int i = 0; i < fieldNames.size(); i++) {
            String field = fieldNames.get(i);
            // 枚举值转大写（如name -> NAME）
            code.append("        ").append(field.toUpperCase());
            // 最后一个枚举不加逗号
            if (i != fieldNames.size() - 1) {
                code.append(",");
            }
            code.append("\n");
        }
        code.append("    }\n\n");

        // 8. getValue方法
        code.append("    public Object getValue(").append(simpleName).append("Field field) {\n");
        code.append("        switch (field) {\n");
        for (String field : fieldNames) {
            code.append("            case ").append(field.toUpperCase()).append(":\n");
            code.append("                return ").append(lowerFirst(simpleName)).append(".get").append(upperFirst(field)).append("();\n");
        }
        code.append("        }\n");
        code.append("        return null;\n");
        code.append("    }\n");

        // 9. 类结束
        code.append("}\n");


        // 写入文件
        try (FileWriter writer = new FileWriter(fetcherClassName + ".java")) {
            writer.write(code.toString());
        }
        System.out.println("生成成功：");
    }

    // 首字母小写（用于实体对象名，如Customer -> customer）
    private static String lowerFirst(String str) {
        if (str == null || str.isEmpty()) {
            return str;
        }
        return Character.toLowerCase(str.charAt(0)) + str.substring(1);
    }

    // 首字母大写（用于getter方法，如name -> Name）
    private static String upperFirst(String str) {
        if (str == null || str.isEmpty()) {
            return str;
        }
        return Character.toUpperCase(str.charAt(0)) + str.substring(1);
    }


    // 测试示例：生成CustomerFetcher
    public static void main(String[] args) throws IOException {
        // 生成CustomerFetcher（与示例代码一致）
        generateFetcher(PayInfo.class);
    }
}